package org.springblade.common.utils;


import org.springblade.common.enums.Enumerator;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * @version V1.0
 * @Title: 枚举工具类
 * @ClassName: EnumUtils.java
 * @Description:
 * @author: gw_wangzq
 * @date: 2021/6/10 22:19
 */
public final class EnumUtils {

	private EnumUtils() {
	}

	/**
	 * 对implement com.sany.business.qap.global.enums.Enumerator的枚举进行转换成下拉列表
	 *
	 * @param clazz
	 * @param <E>
	 * @return
	 */
	public static <E extends Enum<?> & Enumerator> Map<String, String> enumToMap(Class<E> clazz) {
		E[] enumConstants = clazz.getEnumConstants();
		Map<String, String> map = new LinkedHashMap<>();
		for (E e : enumConstants) {
			map.put(e.value(), e.description());
		}
		return map;
	}

	/**
	 * 根据value找到枚举
	 *
	 * @param enumClazz
	 * @param value
	 * @param <E>
	 * @return
	 */
	public static <E extends Enum<?> & Enumerator> Optional<E> getEnumByValue(Class<E> enumClazz, final String value) {

		return Stream.of(enumClazz.getEnumConstants())
			.filter(enumerator -> Objects.equals(enumerator.value(), value))
			.findAny();
	}

	/**
	 * 根据desc找到枚举
	 *
	 * @param enumClazz
	 * @param desc
	 * @param <E>
	 * @return
	 */
	public static <E extends Enum<?> & Enumerator> Optional<E> getEnumByDesc(Class<E> enumClazz, final String desc) {

		return Stream.of(enumClazz.getEnumConstants())
			.filter(enumerator -> Objects.equals(enumerator.description(), desc))
			.findAny();
	}


}
